package fr.lip6.move.care

import java.util.List
import java.util.ArrayList
import sdmakerz_v1.coresyntax.SDMakerV1RuntimeModule
import sdmakerz_v1.coresyntax.generator.interfaces.IContext
import sdmakerz_v1.coresyntax.sDMakerV1.DiagramRef
import sdmakerz_v1.coresyntax.generator.SDMakerV1IDProvider
import sdmakerz_v1.coresyntax.generator.interfaces.IDiagramRefData
import sdmakerz_v1.coresyntax.generator.interfaces.IInputData
import sdmakerz_v1.coresyntax.sDMakerV1.Diagram

class CareDiagramRefGen {
	private CareGen mainGenerator;
	
	new(CareGen mainGenerator){
		this.mainGenerator= mainGenerator;
	}
	
	def public 
	CompileResult compile(IContext context, DiagramRef diagramRef){
	    var refID= "bloc_ref_id"+SDMakerV1IDProvider::computeID
        var List<CompileResult> nestedCompileResult= 
        	new ArrayList<CompileResult>();
        var oldRefData= context.getDiagramRefData;
        var IDiagramRefData newRefData= 
        	SDMakerV1RuntimeModule::
        		bindIDiagramRefData.newInstance
        var IInputData oldInputData= context.getInputData();
        var IInputData inputData= 
			SDMakerV1RuntimeModule::
				bindIInputData.newInstance
        var Diagram d= null;
        
        /* On altere le contexte de generation */
        
        inputData.setInput(context.findDiagramInput(diagramRef.ref));
        context.setInput(inputData);
        d= context.findDiagram(diagramRef.ref);   
                
        newRefData.init(
        	d, diagramRef, context.getDiagramRefData, d.name);
        	
        context.setDiagramRefData(newRefData);
		
        /* On compile dans le nouveau contexte */    
           
        var int i= 0;
            
        var CharSequence charSequenceResult=
        '''
		//STARTING «refID»
		
        «FOR elt: d.diagram_elts»
        «var CompileResult compRes = mainGenerator.compile(context, elt)»
        «IF compRes.isAddableToEntryPoint»
        «SDMakerToCareUtils::toNullExp(nestedCompileResult.add(compRes))»
        «ENDIF»
        «compRes.charSequenceResult»
        «ENDFOR»
        
        //FINALIZING «refID»
        «IF nestedCompileResult.size > 1»
        BlockList «refID» = new BlockList();
        «FOR compRes: nestedCompileResult»
        «refID».add(«compRes.eltID»);
        «ENDFOR»
        «ELSEIF nestedCompileResult.size == 1»
        Block «refID»= «nestedCompileResult.get(0).eltID»;
        «ENDIF»
        '''
        
        /* On restaure le contexte */
        
        context.setDiagramRefData(oldRefData);
        context.setInput(oldInputData);
       
        
        return new CompileResult(
    				charSequenceResult,
    				refID,
    				true)
	}
}